MySQL 修改数据库编码为utf8mb4以插入emoj

最近项目里需要往MySQL里插入emoj,把表的编码改成了utfbmb4之后发现,在mysql shell里面是可以插入emoj的,但是利用pymysql则无法插入emoj,报如下错误

1
pymysql.err.InternalError: (1366, "Incorrect string value: '\\xF0\\x9F\\x98\\x85\\xF0\\x9F...' for column 'content' at row 1")

现总结自己的解决方案如下

0x01 修改mysql默认编码

参照更改MySQL数据库的编码为utf8mb4一文将数据库默认编码修改为utf8mb4

特别记录自己的mysql重启命令

1
2
3
4
5
# 关闭mysql
/usr/local/mysql/bin/mysqladmin -uroot -p shutdown

# 启动mysql
/usr/local/mysql/bin/mysqld_safe —defaults-file="/etc/my.cnf" &

其中/usr/local/mysql/为mysql安装路径。

0x02 修改/usr/share/mysql/charsets/Index.xml

修改完mysql默认编码之后登入mysql,发现报如下错误

1
mysql: Character set 'utf8mb4' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file

参照Character set ‘utf8mb4’ is not a compiled character set解决

特别注意<charset name="utf8mb4">要在<charset name="utf8">之前

0x03 修改数据库,表,字段的编码

0x02之后已可以成功登入,但pymysql插入仍报之前的错,于是将数据库,表和相应字段的编码都改为utf8mb4,pymysql插入成功。

数据库,表和字段的编码修改方式如下:

1
2
3
4
5
6
7
8
-- database
ALTER DATABASE DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- table
ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- column
ALTER TABLE TABLE_NAME MODIFY COLUMN COLUMN_NAME longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

参考